写了7年代码,第一次见这么狗血的小Bug!
刚刚修我们鱼聪明 AI 助手平台的一个 Bug,结局很狗血!赶紧给大家分享一下,顺便也分享下标准的排查 Bug 思路。
事情是这样的,有小伙伴在鱼聪明平台(https://www.yucongming.com)创建了一个 AI 助手,名称为【软件开发人员】。当我搜索 “软件开发” 时,能搜出这个模型:
结果搜索 “软件开发人员”,也就是助手的全名称时,竟然搜不出结果了?!
遇到这种事,先从前端出发:第一时间确认前端发送的请求参数是否正确。
按 F12 打开网络控制台,发现搜索关键词传的没毛病:
然后鱼皮顺着网线爬到后端,先要确认一下从数据库中有没有查出最原始的数据,再考虑是不是被业务代码过滤掉了。
在本地开启数据库的查询日志,用的是 MyBatis Plus 框架,开启日志的代码如下:
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
再次执行搜索,打印出的 SQL 记录如图:
把参数拼到 SQL 语句模板中,就是 name like '%软件开发人员%',看上去没有任何问题。
再次验证,接下来我们把拼接好的 SQL 放到数据库控制台进行真实查询:
结果查询结果为 0:
奇怪了,难道数据库中没有这条记录?但是为啥搜索 “软件开发” 的时候,能搜出这个助手呢?
然后我又用助手的 id 去数据库中查询,发现确实有名称为 “软件开发人员” 的数据。
气了气了,为啥查不出来啊?!大家也可以猜一猜。
这个时候我其实已经有想法了,难道是数据库中存储的 name 和我们看到的 name 格式(或者字符)不一致?于是我就从数据库中把 name 的值复制出来,如图:
结果,从数据库中复制出来的 name 作为查询条件,是能查出结果的!
于是就有了下面这张神奇的截图,两个 “一模一样” 的 SQL 语句,一个有结果,一个没结果:
基本就可以确认了,此 “软件开发人员” 非彼 “软件开发人员”,这两个字符串是不一致的!
于是我分别用这两个字符串来生成 MD5 Hash 码,发现 Hash 码不同,说明原字符串不同。
再进行更精确地对比,发现是 “人” 字不同:
坑啊!谁能看出来这两个 “人” 字有区别!
到底有啥区别呢?问下鱼聪明 AI 吧~
结果一秒破案:原来第一个 “人” 是全角字符。所以程序本身没有任何 Bug,这真的是泰裤辣!
大概整个案件就是这样。所以说,我们看到得未必是真实的,这个 Bug 让我想起了很多朋友初上大学时经常把中英文逗号、中英文冒号搞混,这种 Bug 真是让人哭笑不得。希望各位程序员朋友们,尽量不要遇到吧,遇到了的话,想想我这篇文章,说不定就有了解决的思路呢。
往期推荐